package pe.com.cruzdelsur.aplicacion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;

import org.primefaces.event.SelectEvent;
import org.springframework.dao.DataAccessException;

import pe.com.cruzdelsur.dominio.Plantilla;
import pe.com.cruzdelsur.dominio.Solicitud;
import pe.com.cruzdelsur.dominio.UnidadVehicular;
import pe.com.cruzdelsur.servicios.PlantillaService;
import pe.com.cruzdelsur.servicios.SolicitudService;
import pe.com.cruzdelsur.servicios.UnidadVehicularService;
import pe.com.cruzdelsur.util.Constantes;
import pe.com.cruzdelsur.util.Util;

@ManagedBean(name = "solicitudController")
@SessionScoped
public class SolicitudController implements Serializable {
	private static final long serialVersionUID = 1L;

	private static final String SUCCESS = "successSolicitud";
	private static final String ERROR = "error";
	private static final String ACTIVIDAD = "solicitud";

	@ManagedProperty(value = "#{SolicitudServiceImpl}")
	SolicitudService solicitudService;
	
	@ManagedProperty(value = "#{UnidadVehicularServiceImpl}")
	UnidadVehicularService unidadVehicularService;

	List<SolicitudDTO> listaSolicitudDTO;
	
	List<UnidadVehicularDTO> listaUV;
	UnidadVehicularDTO unidadVehicularDTO;

	private int nroSolicitud;
	private String solicitante;
	private Date fechaInicio;
	private Date fechaFin;
	private String estado;
	private String placa;
	private String modelo;
	private String motivo;
	private String codigoVehiculo;
	private SolicitudDTO solicitudDTO = new SolicitudDTO();
	private Solicitud solicitudEntity;
	private boolean switchBuscar;

	private boolean insert;
	private boolean update;
	private boolean diagnostico;
	private boolean  switchMostrarVehiculoDialog;

	private String titulo;

	public List<SolicitudDTO> cargarListaSolicitud() {
		try {

			SolicitudDTO sDTO = null;
			List<Solicitud> listaPlantillas = solicitudService.listar();

			for (Solicitud s : listaPlantillas) {

				sDTO = new SolicitudDTO();
				sDTO.setSolicitudId(s.getSolicitudId());
				sDTO.setSolicitante(s.getSolicitante());
				sDTO.setPlaca(s.getUnidadVehicular().getPlaca());
				sDTO.setCodigoVehiculo(s.getUnidadVehicular()
						.getUnidadVehicularId());
				sDTO.setMotivo(s.getMotivo());
				sDTO.setEstado(s.getEstado());

				if ("1".equals(s.getEstado())) {
					sDTO.setDscrpEstado("Registrado");
				} else if ("2".equals(s.getEstado())) {
					sDTO.setDscrpEstado("Diagnosticado");
				} else if ("3".equals(s.getEstado())) {
					sDTO.setDscrpEstado("Registrado");
				} else if ("4".equals(s.getEstado())) {
					sDTO.setDscrpEstado("Cancelado");
				}

				sDTO.setFecha(s.getFechaIngreso());

				listaSolicitudDTO.add(sDTO);
			}

		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return listaSolicitudDTO;
	}

	@PostConstruct
	public void init() {

		if (!switchBuscar) {
			listaSolicitudDTO = new ArrayList<SolicitudDTO>();
			cargarListaSolicitud();
			// solicitudDTO = new SolicitudDTO();
		}
	}

	public void insertar() {

		switchBuscar = true;

		if (validarSolicitud()) {

			Solicitud s = new Solicitud();

			s.setEstado("1");
			s.setSolicitante(solicitudDTO.getSolicitante());
			s.setFechaIngreso(solicitudDTO.getFecha());
			s.setMotivo(solicitudDTO.getMotivo());
			s.setUnidadVehicular(new UnidadVehicular(solicitudDTO
					.getCodigoVehiculo()));

			solicitudService.insertar(s);

			listaSolicitudDTO.clear();

			cargarListaSolicitud();

			Util.mensajeInformacion("Registro exitoso");
			Util.sendRedirect("pages/solicitud.jsf");

		}

	}

	public void listar() {
		try {
			listaSolicitudDTO.clear();

			cargarListaSolicitud();

		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public void open() {

		Util.sendRedirect("pages/solicitud.jsf");

	}

	public void irModificar() {

		titulo = "Modificar ";

		switchBuscar = true;

		update = true;

		insert = false;

		diagnostico = false;

		Util.sendRedirect("pages/solicitudNew.jsf");

	}

	public void actualizar() {

		switchBuscar = true;

		if (solicitudDTO != null) {

			if (validarSolicitud()) {

				Solicitud s = new Solicitud();

				s.setSolicitudId(solicitudDTO.getSolicitudId());

				solicitudEntity = solicitudService.buscar(s);

				solicitudEntity.setEstado(solicitudDTO.getEstado());

				solicitudEntity.setUnidadVehicular(new UnidadVehicular(
						solicitudDTO.getCodigoVehiculo()));

				solicitudEntity.setSolicitante(solicitudDTO.getSolicitante());

				solicitudEntity.setFechaIngreso(solicitudDTO.getFecha());

				solicitudEntity.setMotivo(solicitudDTO.getMotivo());

				solicitudService.actualizar(solicitudEntity);
				
				listaSolicitudDTO.clear();

				cargarListaSolicitud();
				
				Util.mensajeInformacion("Modificacion exitosa");

				Util.sendRedirect("pages/solicitud.jsf");

			}

		}


	}

	public void irDiagnostico() {

		titulo = "Diagnostico ";

		switchBuscar = true;

		diagnostico = true;

		insert = false;

		update = false;

		Util.sendRedirect("pages/solicitudNew.jsf");

	}

	public void diagnostico() {

		switchBuscar = true;

		if (solicitudDTO != null) {

			if (validarDiagnostico()) {

				Solicitud s = new Solicitud();

				s.setSolicitudId(solicitudDTO.getSolicitudId());

				solicitudEntity = solicitudService.buscar(s);

				solicitudEntity.setEstado("2");

				solicitudEntity.setUnidadVehicular(new UnidadVehicular(
						solicitudDTO.getCodigoVehiculo()));

				solicitudEntity.setSolicitante(solicitudDTO.getSolicitante());

				solicitudEntity.setFechaIngreso(solicitudDTO.getFecha());

				solicitudEntity.setMotivo(solicitudDTO.getMotivo());

				solicitudEntity.setDiagnostico(solicitudDTO.getDiagnostico());

				solicitudService.actualizar(solicitudEntity);
				
				listaSolicitudDTO.clear();

				cargarListaSolicitud();
				
				Util.mensajeInformacion("Diagnostico Actualizado");

				Util.sendRedirect("pages/solicitud.jsf");
			}

		}

	}

	public void eliminar() {

		switchBuscar = true;

		if (solicitudDTO != null) {

			Solicitud s = new Solicitud();

			s.setSolicitudId(solicitudDTO.getSolicitudId());

			solicitudEntity = solicitudService.buscar(s);

			solicitudEntity.setEstado(Constantes.DESACTIVO);

			solicitudService.actualizar(solicitudEntity);

		}

		listaSolicitudDTO.clear();

		cargarListaSolicitud();

		Util.sendRedirect("pages/solicitud.jsf");
	}

	public void irNuevo() {

		solicitudDTO = new SolicitudDTO();

		titulo = "Nueva ";

		insert = true;

		diagnostico = false;

		update = false;

		Util.sendRedirect("pages/solicitudNew.jsf");

	}

	public void buscar() {

		switchBuscar = true;

		SolicitudDTO sDTO = new SolicitudDTO();

		listaSolicitudDTO.clear();

		Solicitud sol = new Solicitud();

		sol.setSolicitante(solicitante);

		List<Solicitud> listaSolicitud = solicitudService.buscarLista(sol);

		for (Solicitud s : listaSolicitud) {

			sDTO = new SolicitudDTO();
			sDTO.setSolicitudId(s.getSolicitudId());
			sDTO.setSolicitante(s.getSolicitante());
			sDTO.setPlaca(s.getUnidadVehicular().getPlaca());

			if ("1".equals(s.getEstado())) {
				sDTO.setEstado("Registrado");
			} else if ("2".equals(s.getEstado())) {
				sDTO.setEstado("Diagnosticado");
			} else if ("3".equals(s.getEstado())) {
				sDTO.setEstado("Registrado");
			} else if ("4".equals(s.getEstado())) {
				sDTO.setEstado("Cancelado");
			}

			sDTO.setFecha(s.getFechaIngreso());

			listaSolicitudDTO.add(sDTO);

		}

	}

	public void preEliminarSolicitud() {
		switchBuscar = true;
		try {
			if (solicitudDTO != null) {
				if (solicitudDTO.getSolicitudId() > 0) {
					Util.mostrarOcultarDialog("deleteSolicitudDialog", true);
				}
			}

		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public int getNroSolicitud() {
		return nroSolicitud;
	}

	public void setNroSolicitud(int nroSolicitud) {
		this.nroSolicitud = nroSolicitud;
	}

	public String getSolicitante() {
		return solicitante;
	}

	public void setSolicitante(String solicitante) {
		this.solicitante = solicitante;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public List<SolicitudDTO> getListaSolicitudDTO() {
		return listaSolicitudDTO;
	}

	public void setListaSolicitudDTO(List<SolicitudDTO> listaSolicitudDTO) {
		this.listaSolicitudDTO = listaSolicitudDTO;
	}

	public SolicitudService getSolicitudService() {
		return solicitudService;
	}

	public void setSolicitudService(SolicitudService solicitudService) {
		this.solicitudService = solicitudService;
	}

	public String getPlaca() {
		return placa;
	}

	public void setPlaca(String placa) {
		this.placa = placa;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public String getMotivo() {
		return motivo;
	}

	public void setMotivo(String motivo) {
		this.motivo = motivo;
	}

	public SolicitudDTO getSolicitudDTO() {
		return solicitudDTO;
	}

	public void setSolicitudDTO(SolicitudDTO solicitudDTO) {
		this.solicitudDTO = solicitudDTO;
	}

	public String getCodigoVehiculo() {
		return codigoVehiculo;
	}

	public void setCodigoVehiculo(String codigoVehiculo) {
		this.codigoVehiculo = codigoVehiculo;
	}

	public boolean isSwitchBuscar() {
		return switchBuscar;
	}

	public void setSwitchBuscar(boolean switchBuscar) {
		this.switchBuscar = switchBuscar;
	}

	private boolean validarSolicitud() {
		boolean switchRetorno = true;
		try {
			if (Util.esNuloOVacio(solicitudDTO.getPlaca())) {
				Util.mensajeErrorPorId("Debe ingresar la placa del Vehiculo",
						"modelo");
				switchRetorno = false;
			}

			if (Util.esNuloOVacio(solicitudDTO.getSolicitante())) {
				Util.mensajeErrorPorId("Debe ingresar el solicitante",
						"solicitante");
				switchRetorno = false;
			}

			if (Util.esNuloOVacio(solicitudDTO.getFecha())) {
				Util.mensajeErrorPorId("Debe ingresar la fecha", "fecha");
				switchRetorno = false;
			}

			if (Util.esNuloOVacio(solicitudDTO.getMotivo())) {
				Util.mensajeErrorPorId("Debe ingresar el motivo", "motivo");
				switchRetorno = false;
			}

		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return switchRetorno;
	}

	private boolean validarDiagnostico() {
		boolean switchRetorno = true;
		try {
			if (Util.esNuloOVacio(solicitudDTO.getPlaca())) {
				Util.mensajeErrorPorId("Debe ingresar la placa del Vehiculo",
						"modelo");
				switchRetorno = false;
			}

			if (Util.esNuloOVacio(solicitudDTO.getSolicitante())) {
				Util.mensajeErrorPorId("Debe ingresar el solicitante",
						"solicitante");
				switchRetorno = false;
			}

			if (Util.esNuloOVacio(solicitudDTO.getFecha())) {
				Util.mensajeErrorPorId("Debe ingresar la fecha", "fecha");
				switchRetorno = false;
			}

			if (Util.esNuloOVacio(solicitudDTO.getMotivo())) {
				Util.mensajeErrorPorId("Debe ingresar el motivo", "motivo");
				switchRetorno = false;
			}

			if (Util.esNuloOVacio(solicitudDTO.getDiagnostico())) {
				Util.mensajeErrorPorId("Debe ingresar el Diagnostico",
						"diagnostico");
				switchRetorno = false;
			}

		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return switchRetorno;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public boolean isInsert() {
		return insert;
	}

	public void setInsert(boolean insert) {
		this.insert = insert;
	}

	public boolean isUpdate() {
		return update;
	}

	public void setUpdate(boolean update) {
		this.update = update;
	}

	public boolean isDiagnostico() {
		return diagnostico;
	}

	public void setDiagnostico(boolean diagnostico) {
		this.diagnostico = diagnostico;
	}
	
	public void irVehiculoDialog() {
		try {	
			   List<UnidadVehicular> list = unidadVehicularService.listar();
			   
			   listaUV = new ArrayList<UnidadVehicularDTO>();
			   
			   for (UnidadVehicular uv : list) {
				   
				   unidadVehicularDTO =  new UnidadVehicularDTO();
				   
				   unidadVehicularDTO.setUnidadVehicularId(uv.getUnidadVehicularId());
				   
				   unidadVehicularDTO.setPlaca(uv.getPlaca());
				   
				   unidadVehicularDTO.setMarcaId(uv.getMarcaId());
				   
				   unidadVehicularDTO.setModeloId(uv.getModeloId());
				   				   
				   listaUV.add(unidadVehicularDTO);
				
			   	}
			   
				switchMostrarVehiculoDialog = true;
				Util.mostrarOcultarDialog("vehiculoDialog", true);
			
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}
	
	public void cerrarVehiculoDialog() {
		try {
			unidadVehicularDTO =  new UnidadVehicularDTO();
			listaUV.clear();
			switchMostrarVehiculoDialog = false;
			Util.mostrarOcultarDialog("vehiculoDialog", false);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
	}

	public boolean isSwitchMostrarVehiculoDialog() {
		return switchMostrarVehiculoDialog;
	}

	public void setSwitchMostrarVehiculoDialog(boolean switchMostrarVehiculoDialog) {
		this.switchMostrarVehiculoDialog = switchMostrarVehiculoDialog;
	}

	public List<UnidadVehicularDTO> getListaUV() {
		return listaUV;
	}

	public void setListaUV(List<UnidadVehicularDTO> listaUV) {
		this.listaUV = listaUV;
	}

	public UnidadVehicularDTO getUnidadVehicularDTO() {
		return unidadVehicularDTO;
	}

	public void setUnidadVehicularDTO(UnidadVehicularDTO unidadVehicularDTO) {
		this.unidadVehicularDTO = unidadVehicularDTO;
	}

	public UnidadVehicularService getUnidadVehicularService() {
		return unidadVehicularService;
	}

	public void setUnidadVehicularService(
			UnidadVehicularService unidadVehicularService) {
		this.unidadVehicularService = unidadVehicularService;
	}
	
	
	public void vehiculoElegido(){
	
		try {
			solicitudDTO.setCodigoVehiculo(unidadVehicularDTO.getUnidadVehicularId());
			solicitudDTO.setPlaca(unidadVehicularDTO.getPlaca());
			listaUV.clear();
			switchMostrarVehiculoDialog = false;
			Util.mostrarOcultarDialog("vehiculoDialog", false);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		
	}
			
}
